Open Union
拡張可能(Open)な、Union型
a type-indexed coproduct of functors
特にpackageが必要というわけでもない
拡張可能な、Union型である
だから、OpenなUnion
code:hs
data Value
= Unit ()
| Bool Bool
| Integer Integer
| Char Char
そうすれば[Value]とすることで、複数の型を含んだリストを作ることができる
しかし、これはあとから拡張ができない
いわばClosed Unionであるmrsekut.icon
code:hs
data UnionValue = forall x . UnionValue x
このUnionValue型は、UnionであるValue型を拡張可能にしたものと見なせる
code:hs
value = [ UnionValue (123 :: Integer)
, UnionValue True
, UnionValue ()
, UnionValue 'c'
]
存在型の定義の仕方を工夫すれば、「MonadのみのOpen Union」なども定義できる
いくつかのGHC拡張を使うことで、拡張可能な型レベルリストを構成できる
code:hs
data UnionValue (as :: *) = forall a . UnionValue Word a AからBへの変化を見れば分かる通り、これもOpen Unionである
UseCase層にて、Repository層の関数が返す複数種類のエラーを扱うためにOpen Unionを用いている